#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# pip2 install pywin32,安装win32模块
# pip2 install Pillow,另一种截屏方式
import time
import win32gui
import win32ui
import win32con
import win32api
from ctypes import *
from PIL import ImageGrab


# 从x,y位置,截图长宽w,h
# 结果图片啊是个bmp编码,文件较大
# 如果只传入文件名,则截取全屏
def capture_screen_win32(filename, x=None, y=None, w=None, h=None):
    if not filename.endswith('.bmp'):
        filename += '.bmp'  # 没有后缀时添加一个
    if x is None and y is None and w is None and h is None:
        display_dev = win32api.EnumDisplayMonitors(None, None)
        w, h = display_dev[0][2][2], display_dev[0][2][3]
        x, y = 0, 0  # 如果获取图片长宽为0,则截取全屏
    hwnd = 0  # 窗口的编号，0号表示当前活跃窗口
    # 根据窗口句柄获取窗口的设备上下文DC（Divice Context）
    hwnd_dc = win32gui.GetWindowDC(hwnd)
    # 根据窗口的DC获取mfcDC
    mfc_dc = win32ui.CreateDCFromHandle(hwnd_dc)
    # mfcDC创建可兼容的DC
    save_dc = mfc_dc.CreateCompatibleDC()
    # 创建bigmap准备保存图片
    save_bitmap = win32ui.CreateBitmap()
    # 为bitmap开辟空间
    save_bitmap.CreateCompatibleBitmap(mfc_dc, w, h)
    # 高度saveDC，将截图保存到saveBitmap中
    save_dc.SelectObject(save_bitmap)
    # 截取从左上角（0，0）长宽为（w，h）的图片
    save_dc.BitBlt((0, 0), (w, h), mfc_dc, (x, y), win32con.SRCCOPY)
    save_bitmap.SaveBitmapFile(save_dc, filename)
    # 下面释放资源
    mfc_dc.DeleteDC()
    save_dc.DeleteDC()
    win32gui.ReleaseDC(hwnd, hwnd_dc)
    win32gui.DeleteObject(save_bitmap.GetHandle())


# 从x,y位置,截图长宽w,h
# 结果图片啊是个bmp编码,文件较小
def capture_screen_pil(x, y, w, h, filename):
    im = ImageGrab.grab((x, y, x + w, y + h))
    im.save(filename + '.png')


# 移动鼠标到指定位置
def mouse_move(move_x, move_y):
    windll.user32.SetCursorPos(move_x, move_y)


# 鼠标左键点击一次
def mouse_click(click_x=None, click_y=None):
    if click_x is not None and click_y is not None:
        mouse_move(click_x, click_y)
        # 每次点击都带停顿,避免操作太快了
        time.sleep(0.5)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)


# 经过分析,使用win32截图速度快,bmp格式可以直接得到每个像素的rgb值
# 使用PIL库截图体积较小,默认使用png格式,需要特殊的库来解析
# 通过一下代码分析得出,win32获取截图更快速
if __name__ == '__main__':
    pass
    # a = time.time()
    # for i in range(100):
    #     capture_screen_win32(110, 100, 800, 550, '1')
    # b = time.time()
    # print b - a
    #
    # a = time.time()
    # for i in range(100):
    #     capture_screen_pil(110, 100, 800, 550, '2')
    # b = time.time()
    # print b - a
